import java.util.*;
import java.util.stream.Collectors;

public class Test {
    public static void main(String[] args) {
        /* 1. 基本 CRUD */
        Set<String> set = new HashSet<>();
        set.add("apple");
        set.add("banana");
        set.add("apple");        // 重复，插入失败
        System.out.println("初始set: " + set);   // [banana, apple]  顺序无序

        System.out.println("contains apple? " + set.contains("apple")); // true
        System.out.println("remove banana? " + set.remove("banana"));   // true
        System.out.println("当前大小: " + set.size());                   // 1

        /* 2. 遍历三件套 */
        // 2.1 增强 for
        for (String s : set) System.out.print(s + " ");
        System.out.println();

        // 2.2 迭代器
        for (Iterator<String> it = set.iterator(); it.hasNext(); ) {
            System.out.print(it.next() + " ");
        }
        System.out.println();

        // 2.3 Java 8 函数式
        set.forEach(s -> System.out.print(s + " "));
        System.out.println();

        /* 3. 与数组互转 */
        String[] array = set.toArray(new String[0]);
        System.out.println("数组: " + Arrays.toString(array));

        // 数组 → Set（去重神器）
        String[] dupArr = { "a", "b", "a", "c" };
        Set<String> noDup = new HashSet<>(Arrays.asList(dupArr));
        System.out.println("去重后: " + noDup);          // [a, b, c]

        /* 4. 函数式彩蛋：一行去重 + 排序 */
        List<String> sortedUnique =
                Arrays.stream(dupArr)
                      .collect(Collectors.toCollection(LinkedHashSet::new)) // 保持插入顺序
                      .stream()
                      .sorted()
                      .collect(Collectors.toList());
        System.out.println("去重+排序: " + sortedUnique); // [a, b, c]
    }
}
// HashSet 常用方法
// | 目的    | 方法                                          | 示例                                                           |
// | ----- | ------------------------------------------- | ------------------------------------------------------------ |
// | 添加    | `boolean add(E e)`                          | `set.add("A");`                                              |
// | 删除    | `boolean remove(Object o)`                  | `set.remove("A");`                                           |
// | 批量添加  | `boolean addAll(Collection<? extends E> c)` | `set.addAll(list);`                                          |
// | 批量删除  | `boolean removeAll(Collection<?> c)`        | `set.removeAll(list);`                                       |
// | 清空    | `void clear()`                              | `set.clear();`                                               |
// | 存在性   | `boolean contains(Object o)`                | `if (set.contains("A")) …`                                   |
// | 大小/判空 | `int size()` / `boolean isEmpty()`          | `set.size()` / `set.isEmpty()`                               |
// | 遍历    | `forEach(Consumer<? super E> action)` ★     | `set.forEach(System.out::println);`                          |
// | 与数组互转 | `toArray(T[] a)`                            | `String[] arr = set.toArray(new String[0]);`                 |
// | 去重神器  | `new HashSet<>(list)`                       | `List<String> noDup = new ArrayList<>(new HashSet<>(list));` |
